package com.example.mq.common;
import java.io.*;

/*
* 针对二进制序列化,也有很多解决方案~~
* 1.java标准库中提供了序列化的方案. ObjectOutputStream 和 ObjectInputStream
* 2.Hessian
* 3.protoBuffer
* 4.thrift
* */
// 如果想要某个类能够序列化和反序列化,务必需要实现序列化接口 Serializable
public class BinaryTool {
    // 把一个对象序列化为一个byte数组
    public static byte[] toBytes(Object obj) throws IOException {
        // 这个流对象相当于一个变长的字节数组
        // 把object序列化的数据逐渐写入到byteArrayOutputStream中 在同一转成byte[]
        try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                // 此处的writeObject就会把对象进行序列化,生成的二进制字节数据就会写入到ObjectOutputStream中
                // 又因为objectOutputStream关联了byteArrayOutputStream最终结果就写入到byteArrayOutputStream中了
                objectOutputStream.writeObject(obj);
            }
            // 把byteArrayOutputStream中存储的二进制数据转成 byte[] 并返回
            return byteArrayOutputStream.toByteArray();
        }
    }

    // 把一个byte数组反序列化为一个对象
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try(ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)){
            try(ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)){
                // 从data字节数组中读数据 并且进行反序列化
                object = objectInputStream.readObject();
            }
        }
        return object;
    }
}
